const fs = require('fs').promises;
const path = require('path');

// 从serverDZ.cfg读取配置参数
async function readServerDZConfig() {
  try {
    // 假设serverDZ.cfg在DayZServer目录中（相对于DayZWorld）
    const serverDir = 'DayZServer';
    const serverCfgPath = path.join(__dirname, serverDir, 'serverDZ.cfg');
    
    console.log(`正在读取serverDZ.cfg文件: ${serverCfgPath}`);
    
    const content = await fs.readFile(serverCfgPath, 'utf8');
    const config = {};
    
    // 使用正则表达式解析配置参数
    const lines = content.split('\n');
    
    for (const line of lines) {
      const trimmedLine = line.trim();
      
      // 跳过注释和空行
      if (trimmedLine.startsWith('//') || trimmedLine === '') {
        continue;
      }
      
      // 匹配配置参数
      const match = trimmedLine.match(/^(\w+)\s*=(\s*(.+?))?\s*$/);
      if (match) {
        const key = match[1];
        let value = match[3] ? match[3].trim() : '';
        
        // 尝试解析为数字、布尔值或保留为字符串
        if (value.toLowerCase() === 'true') {
          config[key] = true;
        } else if (value.toLowerCase() === 'false') {
          config[key] = false;
        } else if (!isNaN(value) && value !== '') {
          config[key] = parseFloat(value);
        } else if (value.startsWith('"') && value.endsWith('"')) {
          config[key] = value.substring(1, value.length - 1);
        } else {
          config[key] = value;
        }
      }
    }
    
    console.log('成功读取serverDZ.cfg配置');
    return config;
  } catch (error) {
    console.error('读取serverDZ.cfg失败:', error.message);
    return {};
  }
}

// 规范化配置项名称，处理大小写不一致问题
function normalizeConfig(config) {
  if (!config || typeof config !== 'object') return config;
  
  const normalized = { ...config };
  
  // 处理常见的大小写不一致的配置项
  const caseMap = {
    'MaxPing': 'maxPing',
    'enableLogFile': 'enableLog',
    'logFileEnable': 'enableLog'
  };
  
  // 应用大小写规范化
  for (const [oldKey, newKey] of Object.entries(caseMap)) {
    if (normalized[oldKey] !== undefined) {
      // 如果新键名已存在，保留新键名的值
      if (normalized[newKey] === undefined) {
        normalized[newKey] = normalized[oldKey];
      }
      delete normalized[oldKey];
      console.log(`规范化配置键名: ${oldKey} -> ${newKey}`);
    }
  }
  
  // 合并日志相关配置
  if (normalized.doLogs !== undefined) {
    if (normalized.enableLog === undefined) {
      normalized.enableLog = normalized.doLogs;
    }
    delete normalized.doLogs;
    console.log('合并日志配置: doLogs -> enableLog');
  }
  
  return normalized;
}

// 修复并同步配置
async function syncConfig() {
  try {
    // 读取默认配置
    const defaultConfigPath = path.join(__dirname, 'backend', 'config.js');
    const defaultConfigContent = await fs.readFile(defaultConfigPath, 'utf8');
    const defaultConfigMatch = defaultConfigContent.match(/const defaultConfig = ([\s\S]+?);\s*module.exports/);
    
    let defaultConfig = {};
    if (defaultConfigMatch) {
      try {
        defaultConfig = eval(`(${defaultConfigMatch[1]})`);
        defaultConfig = normalizeConfig(defaultConfig);
        console.log('成功读取并规范化默认配置');
      } catch (evalError) {
        console.error('解析默认配置失败:', evalError.message);
      }
    }
    
    // 读取现有config.json
    const configPath = path.join(__dirname, 'config.json');
    let existingConfig = {};
    
    try {
      const existingContent = await fs.readFile(configPath, 'utf8');
      existingConfig = JSON.parse(existingContent);
      console.log('成功读取现有config.json');
      
      // 确保没有嵌套结构
      if (existingConfig.success !== undefined) {
        delete existingConfig.success;
        console.log('移除了冗余的success字段');
      }
      if (existingConfig.data !== undefined) {
        delete existingConfig.data;
        console.log('移除了冗余的data嵌套结构');
      }
      
      // 规范化配置
      existingConfig = normalizeConfig(existingConfig);
    } catch (error) {
      console.error('读取config.json失败，将使用默认配置:', error.message);
    }
    
    // 读取serverDZ.cfg配置
    const serverDZConfig = normalizeConfig(await readServerDZConfig());
    
    // 创建合并的配置 - 优先级: 现有配置 > serverDZ.cfg > 默认配置
    const mergedConfig = {
      ...defaultConfig,
      ...serverDZConfig,
      ...existingConfig,
      // 保留重要的现有配置
      mods: existingConfig.mods || defaultConfig.mods || [],
      addAtPrefix: existingConfig.addAtPrefix !== undefined ? existingConfig.addAtPrefix : defaultConfig.addAtPrefix || false,
      serverLaunchParams: existingConfig.serverLaunchParams || defaultConfig.serverLaunchParams || []
    };
    
    // 再次规范化合并后的配置，确保一致性
    const finalConfig = normalizeConfig(mergedConfig);
    
    // 确保所有必需的字段都存在且类型正确
    if (finalConfig.motd && typeof finalConfig.motd === 'string') {
      // 分割MOTD消息并添加前缀
      finalConfig.motd = finalConfig.motd.split('\n');
      if (finalConfig.addAtPrefix) {
        finalConfig.motd = finalConfig.motd.map(line => '@' + line);
      }
    } else {
      finalConfig.motd = [];
    }
    
    // 确保mods数组存在
    if (!Array.isArray(finalConfig.mods)) {
      finalConfig.mods = [];
    }
    
    // 确保serverLaunchParams数组存在
    if (!Array.isArray(finalConfig.serverLaunchParams)) {
      finalConfig.serverLaunchParams = [];
    }
    
    // 验证配置完整性
    validateConfig(finalConfig);
    
    // 写入修复后的配置文件 - 确保没有嵌套结构
    await fs.writeFile(configPath, JSON.stringify(finalConfig, null, 2));
    console.log('config.json已成功同步和修复，配置项已规范化');
    console.log('\n已同步的配置参数:');
    Object.keys(serverDZConfig).forEach(key => {
      console.log(`  ${key} = ${serverDZConfig[key]}`);
    });
    
    // 所有操作成功完成后才显示成功信息
    console.log('\n配置同步和修复完成！');
    console.log('\n修复的问题：');
    console.log('1. 移除了冗余的嵌套data结构');
    console.log('2. 规范化了配置项键名大小写（如MaxPing -> maxPing）');
    console.log('3. 合并了重复的日志相关配置（如enableLogFile、doLogs）');
    console.log('4. 确保了配置对象的扁平结构');
    console.log('5. 修复了配置优先级问题');
    console.log('6. 添加了配置项大小写规范化处理逻辑');
    
    console.log('\n同步完成！请刷新网页查看更新后的配置。');
    
  } catch (error) {
    console.error('配置同步失败:', error.message);
  }
}

// 验证配置完整性和类型
function validateConfig(config) {
  // 确保mods是数组
  if (!Array.isArray(config.mods)) {
    config.mods = [];
    console.log('修复了mods配置，确保为数组类型');
  }
  
  // 确保重要配置字段存在
  const requiredFields = {
    hostname: 'EXAMPLE NAME',
    maxPlayers: 60,
    serverPort: 2302,
    serverPath: '../DayZServer'
  };
  
  Object.entries(requiredFields).forEach(([key, defaultValue]) => {
    if (config[key] === undefined) {
      config[key] = defaultValue;
      console.log(`添加缺失的必需配置: ${key} = ${defaultValue}`);
    }
  });
}

// 运行同步
console.log('开始同步serverDZ.cfg到config.json...');
syncConfig().catch(error => {
  console.error('同步过程发生错误:', error);
});